/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package converter;

import java.net.URI;
import java.util.Date;
import jpa.entities.ItemPedido;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlTransient;
import javax.xml.bind.annotation.XmlAttribute;
import javax.ws.rs.core.UriBuilder;
import javax.persistence.EntityManager;
import jpa.entities.ItemPedidoPK;
import jpa.entities.Produto;
import jpa.entities.Pedido;

/**
 *
 * @author carlos
 */

@XmlRootElement(name = "itemPedido")
public class ItemPedidoConverter {
    private ItemPedido entity;
    private URI uri;
    private int expandLevel;
  
    /** Creates a new instance of ItemPedidoConverter */
    public ItemPedidoConverter() {
        entity = new ItemPedido();
    }

    /**
     * Creates a new instance of ItemPedidoConverter.
     *
     * @param entity associated entity
     * @param uri associated uri
     * @param expandLevel indicates the number of levels the entity graph should be expanded@param isUriExtendable indicates whether the uri can be extended
     */
    public ItemPedidoConverter(ItemPedido entity, URI uri, int expandLevel, boolean isUriExtendable) {
        this.entity = entity;
        this.uri = (isUriExtendable) ? UriBuilder.fromUri(uri).path(entity.getItemPedidoPK().getPedidoidPedido() + "," + entity.getItemPedidoPK().getProdutoidProduto() + "/").build() : uri;
        this.expandLevel = expandLevel;
        getProduto();
        getPedido();
    }

    /**
     * Creates a new instance of ItemPedidoConverter.
     *
     * @param entity associated entity
     * @param uri associated uri
     * @param expandLevel indicates the number of levels the entity graph should be expanded
     */
    public ItemPedidoConverter(ItemPedido entity, URI uri, int expandLevel) {
        this(entity, uri, expandLevel, false);
    }

    /**
     * Getter for itemPedidoPK.
     *
     * @return value for itemPedidoPK
     */
    @XmlElement
    public ItemPedidoPK getItemPedidoPK() {
        return (expandLevel > 0) ? entity.getItemPedidoPK() : null;
    }

    /**
     * Setter for itemPedidoPK.
     *
     * @param value the value to set
     */
    public void setItemPedidoPK(ItemPedidoPK value) {
        entity.setItemPedidoPK(value);
    }

    /**
     * Getter for dataPedido.
     *
     * @return value for dataPedido
     */
    @XmlElement
    public String getDataPedido() {
        return (expandLevel > 0) ? entity.getDataPedido() : null;
    }

    /**
     * Setter for dataPedido.
     *
     * @param value the value to set
     */
    public void setDataPedido(Date value) {
        entity.setDataPedido(value);
    }

    /**
     * Getter for qtd.
     *
     * @return value for qtd
     */
    @XmlElement
    public Integer getQtd() {
        return (expandLevel > 0) ? entity.getQtd() : null;
    }

    /**
     * Setter for qtd.
     *
     * @param value the value to set
     */
    public void setQtd(Integer value) {
        entity.setQtd(value);
    }

    /**
     * Getter for dataBaixa.
     *
     * @return value for dataBaixa
     */
    @XmlElement
    public Date getDataBaixa() {
        return (expandLevel > 0) ? entity.getDataBaixa() : null;
    }

    /**
     * Setter for dataBaixa.
     *
     * @param value the value to set
     */
    public void setDataBaixa(Date value) {
        entity.setDataBaixa(value);
    }

    /**
     * Getter for statusPedido.
     *
     * @return value for statusPedido
     */
    @XmlElement
    public Character getStatusPedido() {
        return (expandLevel > 0) ? entity.getStatusPedido() : null;
    }

    /**
     * Setter for statusPedido.
     *
     * @param value the value to set
     */
    public void setStatusPedido(Character value) {
        entity.setStatusPedido(value);
    }

    /**
     * Getter for produto.
     *
     * @return value for produto
     */
    @XmlElement
    public ProdutoConverter getProduto() {
        if (expandLevel > 0) {
            if (entity.getProduto() != null) {
                return new ProdutoConverter(entity.getProduto(), uri.resolve("produto/"), expandLevel - 1, false);
            }
        }
        return null;
    }

    /**
     * Setter for produto.
     *
     * @param value the value to set
     */
    public void setProduto(ProdutoConverter value) {
        entity.setProduto((value != null) ? value.getEntity() : null);
    }

    /**
     * Getter for pedido.
     *
     * @return value for pedido
     */
    @XmlElement
    public PedidoConverter getPedido() {
        if (expandLevel > 0) {
            if (entity.getPedido() != null) {
                return new PedidoConverter(entity.getPedido(), uri.resolve("pedido/"), expandLevel - 1, false);
            }
        }
        return null;
    }

    /**
     * Setter for pedido.
     *
     * @param value the value to set
     */
    public void setPedido(PedidoConverter value) {
        entity.setPedido((value != null) ? value.getEntity() : null);
    }

    /**
     * Returns the URI associated with this converter.
     *
     * @return the uri
     */
    //@XmlAttribute
    public URI getUri() {
        return uri;
    }

    /**
     * Sets the URI for this reference converter.
     *
     */
    public void setUri(URI uri) {
        this.uri = uri;
    }

    /**
     * Returns the ItemPedido entity.
     *
     * @return an entity
     */
    @XmlTransient
    public ItemPedido getEntity() {
        if (entity.getItemPedidoPK() == null) {
            ItemPedidoConverter converter = UriResolver.getInstance().resolve(ItemPedidoConverter.class, uri);
            if (converter != null) {
                entity = converter.getEntity();
            }
        }
        return entity;
    }

    /**
     * Returns the resolved ItemPedido entity.
     *
     * @return an resolved entity
     */
    public ItemPedido resolveEntity(EntityManager em) {
        Produto produto = entity.getProduto();
        if (produto != null) {
            entity.setProduto(em.getReference(Produto.class, produto.getIdProduto()));
        }
        Pedido pedido = entity.getPedido();
        if (pedido != null) {
            entity.setPedido(em.getReference(Pedido.class, pedido.getIdPedido()));
        }
        return entity;
    }
}
